/**
 * 日期工具函数
 */

/**
 * 格式化日期为易读的字符串
 * @param {Date|string|number} date - 日期对象、时间戳或日期字符串
 * @param {string} format - 格式化模板，默认为 'YYYY-MM-DD HH:mm:ss'
 * @returns {string} 格式化后的日期字符串
 */
export function formatDate(date, format = 'YYYY-MM-DD HH:mm:ss') {
  if (!date) return '';
  
  // 确保date是Date对象
  if (!(date instanceof Date)) {
    date = new Date(date);
  }
  
  // 如果日期无效，返回空字符串
  if (isNaN(date.getTime())) {
    return '';
  }
  
  const year = date.getFullYear();
  const month = date.getMonth() + 1;
  const day = date.getDate();
  const hours = date.getHours();
  const minutes = date.getMinutes();
  const seconds = date.getSeconds();
  
  // 替换格式字符串
  return format
    .replace('YYYY', year)
    .replace('MM', padZero(month))
    .replace('DD', padZero(day))
    .replace('HH', padZero(hours))
    .replace('mm', padZero(minutes))
    .replace('ss', padZero(seconds));
}

/**
 * 将数字转为两位数字符串，不足两位前面补0
 * @param {number} num - 要格式化的数字
 * @returns {string} 格式化后的字符串
 */
function padZero(num) {
  return num < 10 ? '0' + num : String(num);
}

/**
 * 计算相对时间（如：刚刚、5分钟前、1小时前、昨天等）
 * @param {Date|string|number} date - 日期对象、时间戳或日期字符串
 * @returns {string} 相对时间字符串
 */
export function formatRelativeTime(date) {
  if (!date) return '';
  
  // 确保date是Date对象
  if (!(date instanceof Date)) {
    date = new Date(date);
  }
  
  // 如果日期无效，返回空字符串
  if (isNaN(date.getTime())) {
    return '';
  }
  
  const now = new Date();
  const diff = now.getTime() - date.getTime(); // 毫秒差
  
  // 小于1分钟
  if (diff < 60 * 1000) {
    return '刚刚';
  }
  
  // 小于1小时
  if (diff < 60 * 60 * 1000) {
    return Math.floor(diff / (60 * 1000)) + '分钟前';
  }
  
  // 小于24小时
  if (diff < 24 * 60 * 60 * 1000) {
    return Math.floor(diff / (60 * 60 * 1000)) + '小时前';
  }
  
  // 小于30天
  if (diff < 30 * 24 * 60 * 60 * 1000) {
    const days = Math.floor(diff / (24 * 60 * 60 * 1000));
    if (days === 1) {
      return '昨天';
    } else if (days === 2) {
      return '前天';
    } else {
      return days + '天前';
    }
  }
  
  // 小于12个月
  if (diff < 12 * 30 * 24 * 60 * 60 * 1000) {
    return Math.floor(diff / (30 * 24 * 60 * 60 * 1000)) + '个月前';
  }
  
  // 大于等于12个月
  return Math.floor(diff / (12 * 30 * 24 * 60 * 60 * 1000)) + '年前';
}

/**
 * 获取日期的年、月、日部分
 * @param {Date|string|number} date - 日期对象、时间戳或日期字符串
 * @returns {string} 格式化后的日期字符串 (YYYY-MM-DD)
 */
export function getDatePart(date) {
  return formatDate(date, 'YYYY-MM-DD');
}

/**
 * 获取日期的时、分、秒部分
 * @param {Date|string|number} date - 日期对象、时间戳或日期字符串
 * @returns {string} 格式化后的时间字符串 (HH:mm:ss)
 */
export function getTimePart(date) {
  return formatDate(date, 'HH:mm:ss');
}

/**
 * 判断两个日期是否是同一天
 * @param {Date|string|number} date1 - 第一个日期
 * @param {Date|string|number} date2 - 第二个日期
 * @returns {boolean} 是否是同一天
 */
export function isSameDay(date1, date2) {
  const d1 = new Date(date1);
  const d2 = new Date(date2);
  return d1.getFullYear() === d2.getFullYear() && 
         d1.getMonth() === d2.getMonth() && 
         d1.getDate() === d2.getDate();
}

/**
 * 获取指定日期所在月的天数
 * @param {Date|string|number} date - 日期对象、时间戳或日期字符串
 * @returns {number} 当月天数
 */
export function getDaysInMonth(date) {
  const d = new Date(date);
  // 将日期设置为下个月的第0天，即本月的最后一天
  return new Date(d.getFullYear(), d.getMonth() + 1, 0).getDate();
}
